import ujson as json
import zlib


def parse_okex_msg2(msg):
  json_msg = None
  if json_msg is None:
    try:
      json_msg = json.loads(msg)
    except ValueError:
      pass
  if json_msg is None:
    try:
      json_msg = json.loads(zlib.decompress(bytes(msg), -zlib.MAX_WBITS))
    except zlib.error:
      pass
    except ValueError:
      pass
  return json_msg


def parse_okex_msg(msg, logger=None):
  json_msg = parse_okex_msg2(msg)
  rsp = None
  try:
    if type(json_msg) == list:
      assert len(json_msg) == 1
      rsp = json_msg[0]
    elif type(json_msg) == dict:
      rsp = json_msg
    else:
      raise ValueError("not supported", msg, json_msg)
  except (AssertionError, ValueError, TypeError, KeyError):
    if logger is not None:
      logger.exception('Wrong okex msg: %s', msg)
    else:
      print('Wrong okex msg: %s', msg)
  return rsp


def parse_okex_msg3(msg):
  json_msg = None
  if json_msg is None:
    try:
      json_msg = json.loads(msg)
    except ValueError:
      pass
  if json_msg is None:
    try:
      decompressed = zlib.decompress(bytes(msg), -zlib.MAX_WBITS)
      json_msg = json.loads(decompressed)
    except zlib.error:
      pass
    except ValueError:
      return decompressed.decode()
  return json_msg
